home *** CD-ROM | disk | FTP | other *** search
- #define KDEBUG 0
- /* vmsfunctions.c */
-
- #include <stdio.h>
- #include "make.h"
- #ifdef __DECC
- #include <starlet.h>
- #endif
- #include <descrip.h>
- #include <rms.h>
- #include <iodef.h>
- #include <atrdef.h>
- #include <fibdef.h>
- #include "vmsdir.h"
-
- DIR *opendir(char *dspec)
- {
- static struct FAB *dfab;
- struct NAM *dnam;
- char *searchspec;
-
- if ((dfab = (struct FAB *)xmalloc(sizeof (struct FAB))) == NULL) {
- printf("Error mallocing for FAB\n");
- return(NULL);
- }
- if ((dnam = (struct NAM *)xmalloc(sizeof (struct NAM))) == NULL) {
- printf("Error mallocing for NAM\n");
- free(dfab);
- return(NULL);
- }
- if ((searchspec = (char *)xmalloc(MAXNAMLEN+1)) == NULL) {
- printf("Error mallocing for searchspec\n");
- free(dfab);
- free(dnam);
- return(NULL);
- }
-
- sprintf(searchspec,"%s*.*;",dspec);
-
- *dfab = cc$rms_fab;
- dfab->fab$l_fna = searchspec;
- dfab->fab$b_fns = strlen(searchspec);
- dfab->fab$l_nam = dnam;
-
- *dnam = cc$rms_nam;
- dnam->nam$l_esa = searchspec;
- dnam->nam$b_ess = MAXNAMLEN;
-
- if (!(sys$parse(dfab) & 1)) {
- free(dfab);
- free(dnam);
- free(searchspec);
- return(NULL);
- }
-
- return(dfab);
- }
-
- #include <ctype.h>
- #define uppercasify(str) { char *tmp; for(tmp = (str); *tmp != '\0'; tmp++) if(islower(*tmp)) *tmp = toupper(*tmp); }
-
- struct direct *readdir(DIR *dfd)
- {
- static struct direct *dentry;
- static char resultspec[MAXNAMLEN+1];
- int i;
-
- if ((dentry = (struct direct *)xmalloc(sizeof (struct direct))) == NULL) {
- printf("Error mallocing for direct\n");
- return(NULL);
- }
-
- dfd->fab$l_nam->nam$l_rsa = resultspec;
- dfd->fab$l_nam->nam$b_rss = MAXNAMLEN;
-
- if (debug_flag)
- printf(".");
-
- if (!((i = sys$search(dfd)) & 1)) {
- if (debug_flag)
- printf("sys$search failed with %d\n", i);
- free(dentry);
- return(NULL);
- }
-
- dentry->d_off = 0;
- if (dfd->fab$l_nam->nam$w_fid == 0)
- dentry->d_fileno = 1;
- else dentry->d_fileno = dfd->fab$l_nam->nam$w_fid[0]
- +dfd->fab$l_nam->nam$w_fid[1]<<16;
- dentry->d_reclen = sizeof (struct direct);
- /*
- if (!strcmp(dfd->fab$l_nam->nam$l_type,".DIR"))
- dentry->d_namlen = dfd->fab$l_nam->nam$b_name;
- else
- */
- dentry->d_namlen = dfd->fab$l_nam->nam$b_name+dfd->fab$l_nam->nam$b_type;
- strncpy(dentry->d_name,dfd->fab$l_nam->nam$l_name,dentry->d_namlen);
- dentry->d_name[dentry->d_namlen] = '\0';
- uppercasify(dentry->d_name);
- /* uvUnFixRCSSeparator(dentry->d_name);*/
-
- return(dentry);
- }
-
- closedir(DIR *dfd)
- {
- if (dfd != NULL) {
- if (dfd->fab$l_nam != NULL)
- free(dfd->fab$l_nam->nam$l_esa);
- free(dfd->fab$l_nam);
- free(dfd);
- }
- }
-
- char *getwd(char *cwd)
- {
- static char buf[512];
-
- if (cwd)
- return(getcwd(cwd,512));
- else
- return(getcwd(buf,512));
- }
-
- int
- vms_stat (name, buf)
- char *name;
- struct stat *buf;
- {
- int status;
- int i;
-
- static struct FAB Fab;
- static struct NAM Nam;
- static struct fibdef Fib; /* short fib */
- static struct dsc$descriptor FibDesc =
- {sizeof(Fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (char *)&Fib};
- static struct dsc$descriptor_s DevDesc =
- {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &Nam.nam$t_dvi[1]};
- static char EName[NAM$C_MAXRSS];
- static char RName[NAM$C_MAXRSS];
- static struct dsc$descriptor_s FileName =
- {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
- static struct dsc$descriptor_s string =
- {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
- static unsigned long Rdate[2];
- static unsigned long Cdate[2];
- static struct atrdef Atr[] = {
- {sizeof(Rdate),ATR$C_REVDATE,&Rdate[0]}, /* Revision date */
- {sizeof(Cdate),ATR$C_CREDATE,&Cdate[0]}, /* Creation date */
- {0,0,0}
- };
- static short int DevChan;
- static short int iosb[4];
-
- name = vmsify (name, 0);
-
- /* initialize RMS structures, we need a NAM to retrieve the FID */
- Fab = cc$rms_fab;
- Fab.fab$l_fna = name ; /* name of file */
- Fab.fab$b_fns = strlen(name);
- Fab.fab$l_nam = &Nam; /* FAB has an associated NAM */
-
- Nam = cc$rms_nam;
- Nam.nam$l_esa = EName; /* expanded filename */
- Nam.nam$b_ess = sizeof(EName);
- Nam.nam$l_rsa = RName; /* resultant filename */
- Nam.nam$b_rss = sizeof(RName);
-
- /* do $PARSE and $SEARCH here */
- status = sys$parse(&Fab);
- if (!(status & 1))
- return -1;
-
- DevDesc.dsc$w_length = Nam.nam$t_dvi[0];
- status = sys$assign(&DevDesc,&DevChan,0,0);
- if (!(status & 1))
- return -1;
-
- FileName.dsc$a_pointer = Nam.nam$l_name;
- FileName.dsc$w_length = Nam.nam$b_name+Nam.nam$b_type+Nam.nam$b_ver;
-
- /* Initialize the FIB */
- for (i=0;i<3;i++)
- {
- #if __DECC
- Fib.fib$w_fid[i]=Nam.nam$w_fid[i];
- Fib.fib$w_did[i]=Nam.nam$w_did[i];
- #else
- Fib.fib$r_fid_overlay.fib$w_fid[i]=Nam.nam$w_fid[i];
- Fib.fib$r_did_overlay.fib$w_did[i]=Nam.nam$w_did[i];
- #endif
- }
-
- status = sys$qiow(0,DevChan,IO$_ACCESS,&iosb,0,0,
- &FibDesc,&FileName,0,0,&Atr,0);
- sys$dassgn (DevChan);
- if (!(status & 1))
- return -1;
- status = iosb[0];
- if (!(status & 1))
- return -1;
-
- status = stat (name, buf);
- if (status)
- return -1;
-
- buf->st_mtime = ((Rdate[0]>>24) & 0xff) + ((Rdate[1]<<8) & 0xffffff00);
- buf->st_ctime = ((Cdate[0]>>24) & 0xff) + ((Cdate[1]<<8) & 0xffffff00);
- return 0;
- }
-
- char *
- cvt_time(tval)
- unsigned long tval;
- {
- static long int date[2];
- static char str[27];
- static struct dsc$descriptor date_str =
- {26, DSC$K_DTYPE_T, DSC$K_CLASS_S, str};
-
- date[0] = (tval & 0xff) << 24;
- date[1] = ((tval>>8) & 0xffffff);
-
- if ((date[0]==0) && (date[1]==0))
- return("never");
-
- sys$asctim(0,&date_str,date,0);
- str[26]='\0';
-
- return(str);
- }
-
- /* EOF */
-